package com.rui.mediator.main;

import com.rui.mediator.model.HouseOwner;
import com.rui.mediator.model.MediatorCompany;
import com.rui.mediator.model.Tenant;

/**
 * 中介者模式（mediator pattern）
 * <p>
 * <p>
 * 中介者模式又称为调解者模式或调停者模式。用一个中介对象封装一系列的对象交互，中介者使各对象不需要显示地相互作用，从而使其耦合松散，而且可以独立地改变它们之间的交互。
 * <p>
 * 核心：通过中介者解耦系统各层次对象的直接耦合，层次对象的对外依赖通信统统交由中介者转发。
 * <p>
 * 中介者模式包含以下主要角色：
 * 抽象中介者（Mediator）角色：它是中介者的接口，提供了同事对象注册与转发同事对象信息的抽象方法。
 * 具体中介者（ConcreteMediator）角色：实现中介者接口，定义一个 List 来管理同事对象，协调各个同事角色之间的交互关系，因此它依赖于同事角色。
 * 抽象同事类（Colleague）角色：定义同事类的接口，保存中介者对象，提供同事对象交互的抽象方法，实现所有相互影响的同事类的公共功能。
 * 具体同事类（Concrete Colleague）角色：是抽象同事类的实现者，当需要与其他同事对象交互时，由中介者对象负责后续的交互。
 * <p>
 * <p>
 * 适用场景：
 * 系统中对象之间存在复杂的引用关系，产生的我相互依赖关系结构混乱且难以理解。
 * 交互的公共行为，如果需要改变行为则可以增加新的中介者类。
 * <p>
 * 优点：
 * 减少类间的依赖，将多对多依赖转化成了一对多，降低了类间耦合。
 * 类间各司其职，符合迪米特法则。
 * <p>
 * 缺点：
 * 中介者模式中将原本多个对象直接的相互依赖变成了中介者和多个同事类的依赖关系。当同事类越多时，中介者就会越臃肿，变得复杂且难以维护。
 *
 * @author ZhangRui
 * @date 2023/03/03 16:25
 **/
public class Main {

    public static void main(String[] args) {
        // 先创建三个角色，中介公司，房主，租客
        MediatorCompany mediatorCompany = new MediatorCompany();

        // 房主和租客都在同一家中介公司
        HouseOwner houseOwner = new HouseOwner("张三", mediatorCompany);
        Tenant tenant = new Tenant("李四", mediatorCompany);

        // 中介公司获取房主和租客的信息
        mediatorCompany.setHouseOwner(houseOwner);
        mediatorCompany.setTenant(tenant);

        // 房主和租客都在这家中介公司发布消息，获取到对应的消息
        tenant.connection(tenant.name + "想租一房一厅!");
        houseOwner.connection(houseOwner.name + "这里有!来看看呗!");
        // 测试结果
        // 房主张三获取到的信息:李四想租一房一厅!
        // 租客李四获取到的信息:张三这里有!来看看呗!
    }
}
